﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace SusyGame_Model
{
    public class SpikeDefender : Defender
    {
        // Lista de direcciones donde la torre puede disparar
        private Vector2[] directions = new Vector2[8];
        // Lista de enemigos que esta en el rango del spike defender
        private List<Enemy> targets = new List<Enemy>();

        public override bool HasTarget
        {
            // Esta torre nunca tendra un solo enemigo
            get { return false; }
        }

        public override bool IsInRange(Vector2 position)
        {
            return Vector2.Distance(center, position) <= radius;
        }

        public SpikeDefender(Texture2D texture, Texture2D weaponTexture, Vector2 position)
            : base(texture, weaponTexture, position)
        {
            this.damage = 20;
            this.price = 100;
            this.radius = 300;
            this.Tipo = 1;

            // Creo la lista de todas las direcciones a donde el defensor puede disparar
            directions = new Vector2[]
            {
               new Vector2(-1, -1),
               new Vector2( 0, -1),
               new Vector2( 1, -1), 
               new Vector2(-1,  0),
               new Vector2( 1,  0),
               new Vector2(-1,  1), 
               new Vector2( 0,  1), 
               new Vector2( 1,  1), 
            };
        }

        public override void GetClosestEnemy(List<Enemy> enemies)
        {
            //Limpio la lista de enemigos para buscar desde cero
            targets.Clear();

            // Recorro todos los enemigos
            foreach (Enemy enemy in enemies)
            {
                // Verifico si estan en el rango
                if (IsInRange(enemy.Center))
                {
                    //Lo vuelvo un objetivo.
                    targets.Add(enemy);
                }
            }
        }

        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            // Decido si es tiempo para disparar
            if (WeaponTimer >= 1.0f && targets.Count != 0)
            {
                // Por cada una de las direcciones a donde puede disparar el defender
                for (int i = 0; i < directions.Length; i++)
                {
                    // Creo un weapon que se mueva hacia esa direccion
                    Weapon weapon = new Weapon(WeaponTexture, Vector2.Subtract(center,
                        new Vector2(WeaponTexture.Width / 2)), directions[i], 6, damage);

                    WeaponList.Add(weapon);
                }

                WeaponTimer = 0;
            }

            // Recorro todas las balas
            for (int i = 0; i < WeaponList.Count; i++)
            {
                Weapon weapon = WeaponList[i];
                weapon.Update(gameTime);

                // Elminio todas las balas fuera del rango
                if (!IsInRange(weapon.Center))
                {
                    weapon.Kill();
                }

                // Recorro todos los posibles enemigos
                for (int t = 0; t < targets.Count; t++)
                {
                    // Si la bala a alcanzado al enemigo y esta en el rango
                    if (targets[t] != null && Vector2.Distance(weapon.Center, targets[t].Center) < 50)
                    {
                        // Quito vida al enemigo
                        targets[t].CurrentHealth -= weapon.Damage;
                        weapon.Kill();
                        break;
                    }
                }

                // Remove the bullet if it is dead.
                if (weapon.IsDead())
                {
                    WeaponList.Remove(weapon);
                    i--;
                }
            }
        }

        

        
    }
}
